package cn.it.shop.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Repository;

import cn.it.shop.dao.BaseDao;
/*
 * 公共业务逻辑实现类,所有业务逻辑继承此类,则不需要在写公共的逻辑实现
 * */
@SuppressWarnings("unchecked")
@Repository(value="baseDao")/*value="baseService" 对于 bean id,如果不写则默认为类名(第一个字母小写)*/
@Lazy(true) // 省略value属性
public class BaseDaoImpl<T> implements BaseDao<T> {
	
	private Class clazz;  // clazz就是要操作的类型, 例如Account Category
	
	@Resource(name="sessionFactory")   // name代表要注入的ID的名称,默认不写则与属性名同名
	protected SessionFactory sessionFactory = null;
	
	public BaseDaoImpl(){
		System.out.println("BaseServiceImpl()");
		// 如果子类调用父类构造方法,this代表子类
		System.out.println(this);
		// 获取父类信息,但是不包括泛型信息
		System.out.println(this.getClass().getSuperclass());
		// 获取父类信息,但是不包括泛型参数
		System.out.println(this.getClass().getGenericSuperclass());
		// ParameterizedType获取参数化类型
		ParameterizedType type=(ParameterizedType)this.getClass().getGenericSuperclass();
		clazz=(Class)type.getActualTypeArguments()[0];
	}
	
	@Override
	public void save(T t) {
		// TODO Auto-generated method stub
		Session session = sessionFactory.getCurrentSession();
		session.save(t);
	}

	@Override
	public void update(T t) {
		Session session = sessionFactory.getCurrentSession();
		// Hibernate自动生成HQL语句
		session.update(t);
	}

	@Override
	public void delete(int id) {
		Session session = sessionFactory.getCurrentSession();
		T temp = (T) session.get(clazz, id);
		if (temp != null) {
			session.delete(temp);
		}
		// 不支持级联删除
//		session.createQuery("DELETE FROM " + clazz.getSimpleName() + " WHERE id=:id")
//		.setInteger("id",id)
//		.executeUpdate();
	}

	@Override
	public List<T> query() {
		Session session = sessionFactory.getCurrentSession();
		return session.createQuery("FROM " + clazz.getSimpleName()).list();
	}

	@Override
	public T get(int id) {
		Session session = sessionFactory.getCurrentSession();
		return (T) session.get(clazz, id);
	}

}
